// #include"string.h"
// //strlen:返回的是'\0'之前，字符的个数
// //strcpy：
// //char * strcpy ( char * destination, const char * source );
// //从source 拷贝到 destination 将'\0'拷贝过去并停止 
// namespace zhc
// {
//     // string::string()
//     // :_str(nullptr)
//     // {}
    
//     //这里也不能传nullptr的原因：使用strlen计算长度时 会对str进行解引用 程序会崩溃

//     // string::string(const char* str)
//     // :_str(str)
//     // {}
    
//     //这个有参构造函数错误的原因：str 指向的是"hello" ->只读的
//     //而你成员变量是可读，可写的 -> 上面这样写构造函数是注定不行的

//     //构成构造函数 错误的原因："hello"在代码段 -> 具有常性 ->将其移动到 -> 堆上



//     string::string()
//     {
//         //_str = new char[1]('\0');
//         //为什么不能这样初始化：因为你这里相当于申请了一个字符数组，数组初始haul
//         _str = new char[1]{'0'};
//     }
//     string::string(const char* str)
//     :_str(new char[strlen(str) + 1])
//     {
//         strcpy(_str,str);//将里面的内容拷贝一份
//     }
//     string::~string()
//     {
//        delete[] _str;
//        _str = nullptr;
//     }
//     // this string* this
//     //cosnt 修饰的是const string* this
//     //原因：this在函数调用的时候，就已经确定了，是不能被修改的

//     //拷贝构造函数错误
//     // string::string(string& s)
//     // {
//     //     s._str = new char[strlen(_str) + 1]; 
//     // }
//     string::string(const string& s)
//     :_str(new char[strlen(s._str)] + 1)
//     {
//         strcpy(_str,s._str);
//     }
    
//     //通过这个例子：让我明白了：我们需要将类名放在函数名前

//     //赋值运算符：需要自检验

//     //string返回值 是为了支持连等
//     //完成=的过程是通过函数体来完成，而不是返回值来实现
//     //加上&的原因： a1 = b1 = c1;
//     // 不加上引用的话：返回的是*this的临时副本，等;结束是副本会消失

//     // string& string::operator=(const string& s)
//     // {
//     //    _str = new char[strlen(s._str) + 1];
//     //    strcpy(_str,s._str);
//     //    return *this;
//     // }

//     //这样会造成内存泄漏
//     string& string::operator=(const string& s)
//     {
//         if(this != &s)
//         {
//             delete[] _str;
//             _str = new char[strlen(s._str) + 1];
//             strcpy(_str,s._str);
//             return *this;
//         }
//     }

//     size_t string::size()const 
//     {

//         return strlen(_str);
//     }
//     char& string::operator[](size_t pos)
//     {
//         return _str[pos];
//     }
// }